/**
 * 集合
 */
module.exports = class Set {
  constructor() {
    this.items = {};
  }

  // 是否存在
  has(value) {
    return this.items.hasOwnProperty(value);
  }

  // 添加项
  add(value) {
    if (this.has(value)) {
      return false;
    }
    this.items[value] = value;
    return true;
  }

  // 移除项
  remove(value) {
    if (!this.has(value)) {
      return false;
    }
    delete this.items[value];
    return true;
  }

  // 集合大小
  get size() {
    return Object.keys(this.items).length;
  }

  // 获取集合
  get values() {
    return Object.keys(this.items);
  }

  // 并集
  union(otherSet) {
    const unionSet = new Set();
    this.values.forEach(v => unionSet.add(v));
    otherSet.values.forEach(v => unionSet.add(v));
    return unionSet;
  }

  // 交集
  intersection(otherSet) {
    const intersectionSet = new Set();
    this.values.forEach(v => {
      if (otherSet.has(v)) {
        intersectionSet.add(v);
      }
    });
    return intersectionSet;
  }

  // 差集
  difference(otherSet) {
    const differenceSet = new Set();
    this.values.forEach(v => {
      if (!otherSet.has(v)) {
        differenceSet.add(v);
      }
    });
    return differenceSet;
  }

  // 子集
  subset(otherSet) {
    if (this.size > otherSet.size) {
      return false;
    }
    // 只要子集中的项，有一个不在父集里，就返回 false ，否则 true
    return !this.values.some(v => !otherSet.has(v));
  }
};
